#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
意图理解模块

负责处理用户输入的自然语言命令，将其转换为结构化的意图表示。
"""

import os
import openai
from typing import Dict, Any, Optional
import json


class IntentProcessor:
    """意图处理器类"""

    def __init__(self, api_key: Optional[str] = None):
        """
        初始化意图处理器

        Args:
            api_key: OpenAI API密钥，如果为None则从环境变量获取
        """
        self.api_key = api_key or os.getenv("OPENAI_API_KEY")
        if not self.api_key:
            raise ValueError("未提供API密钥且环境变量OPENAI_API_KEY未设置")

        # 初始化OpenAI
        openai.api_key = self.api_key
        openai.api_base = "https://dashscope.aliyuncs.com/compatible-mode/v1"

        # 意图模板
        self.intent_template = {
            "action": "",  # 动作类型
            "target": "",  # 目标对象
            "parameters": {},  # 动作参数
            "confidence": 0.0,  # 置信度
            "context": {},  # 上下文信息
        }

    def process(self, command: str) -> Dict[str, Any]:
        """
        处理用户命令，提取意图

        Args:
            command: 用户命令字符串

        Returns:
            Dict[str, Any]: 结构化的意图表示
        """
        try:
            # 构建提示词
            prompt = self._build_prompt(command)

            # 调用API获取响应
            response = openai.ChatCompletion.create(
                model="qwen-omni-turbo",
                messages=[
                    {
                        "role": "system",
                        "content": "你是一个六足机器人的意图理解助手。请将用户的自然语言命令转换为结构化的意图表示。",
                    },
                    {"role": "user", "content": prompt},
                ],
                temperature=0.7,
                max_tokens=500,
            )

            # 解析响应
            intent = self._parse_response(response.choices[0].message.content)

            return intent

        except Exception as e:
            print(f"意图处理出错: {e}")
            return {
                "action": "error",
                "target": "system",
                "parameters": {"error": str(e)},
                "confidence": 0.0,
                "context": {},
            }

    def _build_prompt(self, command: str) -> str:
        """
        构建提示词

        Args:
            command: 用户命令字符串

        Returns:
            str: 完整的提示词
        """
        return f"""
请分析以下命令并提取意图：
命令：{command}

请以JSON格式返回以下信息：
1. action: 主要动作（如：移动、停止、转向等）
2. target: 动作目标（如：特定方向、位置等）
3. parameters: 动作参数（如：速度、距离等）
4. confidence: 意图理解的置信度（0-1）
5. context: 上下文信息（如：环境状态、时间等）

示例返回格式：
{{
    "action": "move",
    "target": "forward",
    "parameters": {{
        "speed": 0.5,
        "distance": 1.0
    }},
    "confidence": 0.95,
    "context": {{
        "environment": "indoor",
        "time": "day"
    }}
}}
"""

    def _parse_response(self, response: str) -> Dict[str, Any]:
        """
        解析API响应

        Args:
            response: API返回的响应字符串

        Returns:
            Dict[str, Any]: 解析后的意图表示
        """
        try:
            # 尝试解析JSON
            intent = json.loads(response)

            # 验证必要字段
            for key in self.intent_template:
                if key not in intent:
                    intent[key] = self.intent_template[key]

            return intent

        except json.JSONDecodeError:
            # 如果JSON解析失败，返回错误意图
            return {
                "action": "error",
                "target": "system",
                "parameters": {"error": "JSON解析失败"},
                "confidence": 0.0,
                "context": {},
            }
